gl renderer: Ignore crossfades between equal texture nodes
authorTimm Bäder <mail@baedert.org>
Sat, 5 Dec 2020 12:13:15 +0000 (13:13 +0100)
committerTimm Bäder <mail@baedert.org>
Sun, 6 Dec 2020 18:18:10 +0000 (19:18 +0100)
gsk/gl/gskglrenderer.c

index 7d26d9b838c4d4e288dcd7b2311656d9b103031c..0149fa2598aa807839f0269adf3990aa5420cf64 100644 (file)
@@ -244,6 +244,21 @@ _graphene_rect_contains_rect (const graphene_rect_t *r1,
   return false;
 }
 
+static inline bool G_GNUC_PURE
+equal_texture_nodes (GskRenderNode *node1,
+                     GskRenderNode *node2)
+{
+  if (gsk_render_node_get_node_type (node1) != GSK_TEXTURE_NODE ||
+      gsk_render_node_get_node_type (node2) != GSK_TEXTURE_NODE)
+    return false;
+
+  if (gsk_texture_node_get_texture (node1) !=
+      gsk_texture_node_get_texture (node2))
+    return false;
+
+  return graphene_rect_equal (&node1->bounds, &node2->bounds);
+}
+
 static inline void
 sort_border_sides (const GdkRGBA *colors,
                    int           *indices)
@@ -2656,6 +2671,12 @@ render_cross_fade_node (GskGLRenderer   *self,
       return;
     }
 
+  if (equal_texture_nodes (start_node, end_node))
+    {
+      gsk_gl_renderer_add_render_ops (self, end_node, builder);
+      return;
+    }
+
   /* TODO: We create 2 textures here as big as the cross-fade node, but both the
    * start and the end node might be a lot smaller than that. */